"""
消息和通知相关模型
"""
from datetime import datetime
from sqlalchemy.orm import relationship
from .base import BaseModel, get_db

class Message(BaseModel):
    """消息模型"""
    __tablename__ = 'message'
    
    # 基本信息
    title = get_db().Column(get_db().String(200), nullable=False)  # 消息标题
    content = get_db().Column(get_db().Text, nullable=False)  # 消息内容
    
    # 消息类型和级别
    message_type = get_db().Column(get_db().String(50), nullable=False)  # 消息类型：系统通知、客户管理、任务提醒等
    priority = get_db().Column(get_db().String(10), default='普通')  # 优先级：紧急、高、普通、低
    
    # 发送和接收信息
    sender_id = get_db().Column(get_db().Integer, get_db().ForeignKey('user.id'))  # 发送者ID
    receiver_id = get_db().Column(get_db().Integer, get_db().ForeignKey('user.id'), nullable=True)  # 接收者ID（可为空，群发消息时为空）
    recipient_id = get_db().Column(get_db().Integer, get_db().ForeignKey('user.id'))  # 接收者ID（可选，用于群发）
    
    # 状态信息
    is_read = get_db().Column(get_db().Boolean, default=False)  # 是否已读
    read_at = get_db().Column(get_db().DateTime)  # 阅读时间
    
    # 关联对象
    target_type = get_db().Column(get_db().String(50))  # 关联对象类型：客户、项目、任务等
    target_id = get_db().Column(get_db().Integer)  # 关联对象ID
    
    # 关联关系
    sender = relationship('User', foreign_keys=[sender_id])
    recipient = relationship('User', foreign_keys=[receiver_id])
    
    def mark_as_read(self):
        """标记消息为已读"""
        self.is_read = True
        self.read_at = datetime.now()
        get_db().session.commit()
    
    @staticmethod
    def get_unread_count(user_id):
        """获取用户未读消息数量"""
        return Message.query.filter_by(
            receiver_id=user_id, 
            is_read=False
        ).count()
    
    @staticmethod
    def get_user_messages(user_id, page=1, per_page=10, unread_only=False):
        """获取用户消息列表"""
        query = Message.query.filter_by(receiver_id=user_id)
        
        if unread_only:
            query = query.filter_by(is_read=False)
            
        return query.order_by(Message.created_at.desc()).paginate(
            page=page, per_page=per_page, error_out=False
        )

class MessageRecipient(BaseModel):
    """消息接收者模型（用于群发消息）"""
    __tablename__ = 'message_recipient'
    
    message_id = get_db().Column(get_db().Integer, get_db().ForeignKey('message.id'), nullable=False)
    user_id = get_db().Column(get_db().Integer, get_db().ForeignKey('user.id'), nullable=False)
    is_read = get_db().Column(get_db().Boolean, default=False)
    read_at = get_db().Column(get_db().DateTime)
    
    # 关联关系
    message = relationship('Message')
    user = relationship('User')
    
    def mark_as_read(self):
        """标记消息为已读"""
        self.is_read = True
        self.read_at = datetime.now()
        get_db().session.commit()

class MessageTemplate(BaseModel):
    """消息模板模型"""
    __tablename__ = 'message_template'
    
    name = get_db().Column(get_db().String(100), nullable=False, unique=True)  # 模板名称
    title_template = get_db().Column(get_db().String(200), nullable=False)  # 标题模板
    content_template = get_db().Column(get_db().Text, nullable=False)  # 内容模板
    message_type = get_db().Column(get_db().String(50), nullable=False)  # 消息类型
    priority = get_db().Column(get_db().String(10), default='普通')  # 默认优先级
    is_active = get_db().Column(get_db().Boolean, default=True)  # 是否启用
    
    @staticmethod
    def get_by_name(name):
        """根据名称获取模板"""
        return MessageTemplate.query.filter_by(name=name, is_active=True).first()
    
    def render(self, **kwargs):
        """渲染模板"""
        title = self.title_template.format(**kwargs)
        content = self.content_template.format(**kwargs)
        return title, content